#include "login.h"
#include "ui_login.h"
//json对象
QJsonObject json;//构造一个空的 JSON 对象,用于进行点表下发
Login::Login(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Login)
{
    ui->setupUi(this);

    udpSocket = new QUdpSocket(this);
    tcpSocket= new QTcpSocket(this);
    fliesocket=new QTcpSocket(this);

    connect(ui->pushButtonSearch,SIGNAL(clicked()),this,SLOT(pushButtonGuang()));
    connect(ui->pushButtonConnect,SIGNAL(clicked()),this,SLOT(pushButtonLian()));
    QObject::connect(this, SIGNAL(dataUpSignal(QByteArray)),this, SLOT(dataUpSlot(QByteArray)));



//    connect(ui->pushButtonGuang,SIGNAL(clicked()),this,SLOT(pushButtonGuang()));
//    connect(ui->pushButtonLian,SIGNAL(clicked()),this,SLOT(pushButtonLian()));
    connect(tcpSocket,SIGNAL(readyRead()),this,SLOT(tcpRecv_Sen()));
    //下发心跳包
      timer = new QTimer(this);
      connect(timer, SIGNAL(timeout()), this,SLOT(heartTimer()));
      timer->start(1000); // 1000毫秒为间隔


}

Login::~Login()
{
    delete ui;
}

void Login::on_listView_clicked(const QModelIndex &index)
{
    ui->lineEdit->setText(index.data().toString());
}

//接收数据并显示
void Login::dataUpSlot(QByteArray)
{

}

void Login::pushButtonGuang()
{

    if (!udpSocket->bind(QHostAddress::Any,2222))
    {
        qDebug() << "绑定失败";
        return;
    }

    // 设置广播地址
    QHostAddress BroadcastAddress("192.168.50.255");
    // 构造广播消息
    QString message("coffee");
    QByteArray BroadcastMessage = message.toUtf8();
    // 设置广播端口号
    qint16 BroadcastPort = 7418;
    // 发送广播 内容 IP 端口号
    udpSocket->writeDatagram(BroadcastMessage, BroadcastAddress, BroadcastPort);
    qDebug()<<"aaaaaaa";
    //延时 给予反应时间
    QThread::sleep(1);

    //判断是否有数据传入
    while (udpSocket->hasPendingDatagrams())
    {

        buffer.resize(udpSocket->pendingDatagramSize());

        //接收 数据 大小 IP 端口
        udpSocket->readDatagram(buffer.data(), buffer.size(), &senderAddress, &senderPort);
        qDebug() << "收到来自" << senderAddress.toString() << "的数据: " << buffer;
    }

    QStringList qlist;
    qlist.append(senderAddress.toString());
//    qlist.append("娱乐类：看电影、写小说、听音乐");
//    qlist.append("游戏类：五子棋、扑克牌、中国象棋");

    // 用数据列表创建数据显示模型进行实现
    QStringListModel *listmode = new QStringListModel(qlist);
    ui->listView->setModel(listmode);
}

void Login::pushButtonLian()
{
    QThread::sleep(1);
    qDebug()<<"开始连接";
    // 连接服务器
    tcpSocket->connectToHost(senderAddress,senderPort);
    if(buffer=="yes")
    {
        //QMessageBox::information(this,"信息","tcp连接成功");
        json["type"] = 1;//将json格式 "type" 字段的值设置为 1。
        // 创建JSON文档
        QJsonDocument jsonDoc(json);
        // 将JSON文档转换为字节数组
        QByteArray jsonData = jsonDoc.toJson();
        // 发送JSON数据
        tcpSocket->write(jsonData);
    }
}

void Login::tcpRecv_Sen()
{
    QByteArray data = tcpSocket->readAll();
    // 这里的 data 就包含了从服务器读取到的所有数据
    qDebug()<<data;
    if(data=="fa")
    {
        fliesocket->connectToHost(senderAddress,7417);
        QFile readFile(":/new/prefix2/node.json");
        readFile.open(QIODevice::ReadOnly);//以只读方式读取文件
        QByteArray file;  //用于存储即将读取的文件内容。
        qint64 totalSize = readFile.size();//获取到文件的总大小
        qDebug()<<totalSize;
        file = readFile.read(totalSize);//读取文件的全部内容
        qDebug()<<file;
        fliesocket->write(file);//向设备发送文件
    }
}
//下发心跳包
void Login::heartTimer()
{
    // 添加其他键值对
    json["type"] = 3;
    // 创建JSON文档
    QJsonDocument jsonDoc(json);
    // 将JSON文档转换为字节数组
    QByteArray jsonData = jsonDoc.toJson();

    // 发送JSON数据
    tcpSocket->write(jsonData);

    // 等待数据发送完毕
    if (tcpSocket->waitForBytesWritten())
    {
         qDebug() << "JSON data sent successfully1";
    } else
    {
        qDebug() << "Failed to send JSON data";
    }

}

void Login::on_comboBox_activated(const QString &arg1)
{
    if(arg1=="刷新上报")
    {
            QMQTT::Message aaa;
            aaa.setTopic("down");
//            aaa.setPayload("{\"type\": 1,\"limit\": \"all\",\"keys\": [301, 302, 303, 304 , 305, 306, 307, 308, 101, 102, 103, 104, 105, 106]}");
            aaa.setPayload("{\"type\": 3,\"data\": {\"type\": 0,\"period\": 0}}\0");
            GlobalVal::mqtt->publish(aaa);
    }
    else if(arg1=="变化上报")
    {
        QMQTT::Message aaa;
        aaa.setTopic("down");
        aaa.setPayload("{\"type\": 3,\"data\": {\"type\": 1,\"period\": 0}}\0");
        GlobalVal::mqtt->publish(aaa);
    }
    else if(arg1=="周期上报")
    {
        QMQTT::Message aaa;
        aaa.setTopic("down");
        aaa.setPayload("{\"type\": 3,\"data\": {\"type\": 2,\"period\": 5}}\0");
        GlobalVal::mqtt->publish(aaa);
    }
}






